package main

import (
	"fmt"
	"time"
)

// main函数是程序的入口点。
func main() {
	// 创建一个缓冲大小为10的整型通道，用于生产者和消费者之间的通信。
	messages := make(chan int, 10)
	// 创建一个布尔类型的通道，用于通知消费者停止处理。
	done := make(chan bool)

	// 使用defer确保在main函数退出时关闭messages通道。
	defer close(messages)

	// 启动一个goroutine作为消费者处理messages通道中的消息。
	go func() {
		// 创建一个定时器，每隔一秒触发一次。
		ticker := time.NewTicker(time.Second)
		// 使用range遍历ticker的通道，每隔一秒检查是否有消息需要处理。
		for _ = range ticker.C {
			// 使用select语句监听多个通道。
			select {
			// 如果done通道被关闭，退出goroutine。
			case <-done:
				fmt.Println("child process interrupt……")
				return
			// 默认情况下，尝试从messages通道接收并打印消息。
			default:
				// 默认情况下执行的逻辑，这里只是简单地打印一条信息
				fmt.Printf("send message: %d\n", <-messages)
			}
		}
	}()

	// 主协程作为生产者，向messages通道发送0到9的整数。
	for i := 0; i < 10; i++ {
		messages <- i
	}

	// 主协程休眠5秒，以确保消费者有足够的时间处理所有消息。
	time.Sleep(5 * time.Second)

	// 关闭done通道，通知消费者goroutine停止等待。
	close(done)

	// 再次休眠1秒，确保消费者goroutine有时间响应停止通知并退出。
	time.Sleep(1 * time.Second)

	// 打印主协程退出的消息。
	fmt.Println("main process exit!")
}
